package com.imooc.security.core.social.qq.connect;

import java.nio.charset.Charset;

import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.http.converter.StringHttpMessageConverter;
import org.springframework.social.oauth2.AccessGrant;
import org.springframework.social.oauth2.OAuth2Template;
import org.springframework.util.MultiValueMap;
import org.springframework.web.client.RestTemplate;

/**
 * QQ平台返回的令牌是以text/html作为相应
 * 默认的OAuth2Template在通过授权码换取令牌的时候，无法处理text/html响应，因此自定义
 * @author JZH
 *
 */
public class QQOAuth2Template extends OAuth2Template {
	
	private Logger logger = LoggerFactory.getLogger(getClass());

	public QQOAuth2Template(String clientId, String clientSecret, String authorizeUrl, String accessTokenUrl) {
		super(clientId, clientSecret, authorizeUrl, accessTokenUrl);
		/**
		 * 在QQ接口文档中，需要由五个参数：grant_type、client_id、client_secret、code、redirect_uri
		 * 但是当UseParametersForClientAuthentication参数为false的时候，client_id和client_secret并不会发送，
		 * 因此我们需要设置这个参数为true（spring security默认是false）
		 */
		setUseParametersForClientAuthentication(true);
		// TODO Auto-generated constructor stub
	}
	
	@Override
	protected RestTemplate createRestTemplate() {
		// TODO Auto-generated method stub
		RestTemplate restTemplate = super.createRestTemplate();
		restTemplate.getMessageConverters().add(new StringHttpMessageConverter(Charset.forName("UTF-8")));//处理text/html的contentType
		return restTemplate;
	} 
	
	/**
	 * 解析返回
	 * 
	 */
	@Override
	protected AccessGrant postForAccessGrant(String accessTokenUrl, MultiValueMap<String, String> parameters) {
		// TODO Auto-generated method stub
		String responseStr = getRestTemplate().postForObject(accessTokenUrl, parameters, String.class);
		logger.info("【第三方登录】请求地址："+accessTokenUrl + "  返回结果："+responseStr);
		String[] items = StringUtils.splitByWholeSeparatorPreserveAllTokens(responseStr, "&");
		String accessToken = StringUtils.substringAfterLast(items[0], "=");
		Long expiresIn = new Long(StringUtils.substringAfterLast(items[1], "="));
		String refreshToken = StringUtils.substringAfterLast(items[2], "=");
		return new AccessGrant(accessToken, null, refreshToken, expiresIn);
	}

}
